/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package traspasos.beans;

import entities.EnvioTraspasoMercancia;
import entities.LineaEnvioTraspasoMercancia;
import entities.LineaRecepcionTraspasoMercancia;
import entities.RecepcionTraspasoMercancia;
import entities.Usuario;
import facades.LineaRecepcionTraspasoMercanciaFacade;
import facades.RecepcionTraspasoMercanciaFacade;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;
import qualifiers.EventoEntidadCreada;
import qualifiers.EventoEntidadElegida;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named(value = "nuevaRecepcionTraspasoMercancia")
@SessionScoped
public class NuevaRecepcionTraspasoMercancia implements Serializable{
    private RecepcionTraspasoMercancia nuevaRecepcion;
    @Inject
    @UsuarioLogeado
    private Usuario usuario;
    @Inject
    RecepcionTraspasoMercanciaFacade recepcionTraspasoMercanciaFacade;
    @Inject
    LineaRecepcionTraspasoMercanciaFacade lineaRecepcionTraspasoMercanciaFacade;
    @Inject
    @EventoEntidadCreada 
    Event<LineaRecepcionTraspasoMercancia> eventoNuevaLineaRecepcion;
    @Inject
    @EventoEntidadCreada
    Event<RecepcionTraspasoMercancia> eventoNuevaRecepcionTraspasoMercancia;
    /**
     * Creates a new instance of NuevaRecepcionTraspasoMercancia
     */
    public NuevaRecepcionTraspasoMercancia() {
    }
    
    public void onEnvioElegido(@Observes @EventoEntidadElegida EnvioTraspasoMercancia envioElegido){
        nuevaRecepcion=new RecepcionTraspasoMercancia();
        nuevaRecepcion.setEnvioTraspasoMercancia(envioElegido);
        nuevaRecepcion.setUsuario(usuario);
        nuevaRecepcion.setLineaRecepcionTraspasoMercanciaList(new ArrayList<LineaRecepcionTraspasoMercancia>());
        for (LineaEnvioTraspasoMercancia lineaEnvio : envioElegido.getLineaEnvioTraspasoMercanciaList()) {
            LineaRecepcionTraspasoMercancia lineaRecepcionNueva=new LineaRecepcionTraspasoMercancia();
            lineaRecepcionNueva.setCantidad(0);
            lineaRecepcionNueva.setLineaEnvioTraspasoMercancia(lineaEnvio);
            lineaRecepcionNueva.setRecepcionTraspasoMercancia(nuevaRecepcion);
            nuevaRecepcion.getLineaRecepcionTraspasoMercanciaList().add(lineaRecepcionNueva);
        }
    }
    
    @Transactional
    public String guardar(){
        nuevaRecepcion.setFecha(new Date());
        //List<LineaRecepcionTraspasoMercancia> lineasRec=nuevaRecepcion.getLineaRecepcionTraspasoMercanciaList();
        //nuevaRecepcion.setLineaRecepcionTraspasoMercanciaList(null);
        //recepcionTraspasoMercanciaFacade.create(nuevaRecepcion);
        //nuevaRecepcion.setLineaRecepcionTraspasoMercanciaList(lineasRec);
        for (Iterator<LineaRecepcionTraspasoMercancia> it = nuevaRecepcion.getLineaRecepcionTraspasoMercanciaList().iterator(); it.hasNext();) {
            LineaRecepcionTraspasoMercancia lineaRecepcionTraspasoMercancia = it.next();
            if(lineaRecepcionTraspasoMercancia.getCantidad()<=0){
                it.remove();
            }
        }
        /*for (LineaRecepcionTraspasoMercancia lineaRecepcionTraspasoMercancia : nuevaRecepcion.getLineaRecepcionTraspasoMercanciaList()) {
            lineaRecepcionTraspasoMercancia.setRecepcionTraspasoMercancia(nuevaRecepcion);
            if(lineaRecepcionTraspasoMercancia.getCantidad()>0){
                lineaRecepcionTraspasoMercanciaFacade.create(lineaRecepcionTraspasoMercancia);
                eventoNuevaLineaRecepcion.fire(lineaRecepcionTraspasoMercancia);
            }
        }*/
        //recepcionTraspasoMercanciaFacade.evict(nuevaRecepcion, nuevaRecepcion.getIdRecepcionTraspasoMercancia());
        recepcionTraspasoMercanciaFacade.create(nuevaRecepcion);
        eventoNuevaRecepcionTraspasoMercancia.fire(nuevaRecepcion);
        return "/views/tienda/Traspasos?faces-redirect=true";
    }

    
    public void onChange(LineaRecepcionTraspasoMercancia linea){
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
        Locale locale=context.getViewRoot().getLocale();
        ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
            
        if(linea.getCantidad()<=0){
            if(estanTodasLasLineasVacias()){
                String errorTodasLineasEnvioVacias=rb.getString("ErrorTodasLineasEnvioVacias");
                FacesMessage msg =new FacesMessage(errorTodasLineasEnvioVacias,errorTodasLineasEnvioVacias);
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                context.addMessage(null, msg);
                context.renderResponse();
            }
        }
        else if(linea.getCantidad()>linea.getLineaEnvioTraspasoMercancia().getCantidad()){
            String errorSuperarCantidad=rb.getString("ErrorCantidadSuperada");
            FacesMessage msg =new FacesMessage(errorSuperarCantidad,errorSuperarCantidad);
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
        }
        else if(linea.getCantidad()<linea.getLineaEnvioTraspasoMercancia().getCantidad()){
            String warningIncidencia=rb.getString("ErrorIncidenciaEnvio");
            FacesMessage msg =new FacesMessage(warningIncidencia,warningIncidencia);
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
            context.addMessage(null, msg);
            context.renderResponse();
        }
    }
    
    private Boolean estanTodasLasLineasVacias(){
        Boolean todasVacias=true;
        for (LineaRecepcionTraspasoMercancia lineaRecepcionTraspasoMercancia : nuevaRecepcion.getLineaRecepcionTraspasoMercanciaList()) {
            if(lineaRecepcionTraspasoMercancia.getCantidad()!=0){
                todasVacias=false;
            }
            if(!todasVacias){
                break;
            }
        }
        return todasVacias;
    }
    
    public Boolean getPuedeGuardar(){
        Boolean puedeGuardar=!estanTodasLasLineasVacias() && ningunaLineaSuperaLaCantidad();
        return puedeGuardar;
    }
    
    private Boolean ningunaLineaSuperaLaCantidad(){
        Boolean ningunaSupera=true;
        for (LineaRecepcionTraspasoMercancia lineaRecepcionTraspasoMercancia : nuevaRecepcion.getLineaRecepcionTraspasoMercanciaList()) {
            if(lineaRecepcionTraspasoMercancia.getCantidad()>lineaRecepcionTraspasoMercancia.getLineaEnvioTraspasoMercancia().getCantidad()){
                ningunaSupera=false;
            }
            if(!ningunaSupera){
                break;
            }
        }
        return ningunaSupera;
    }
    /**
     * @return the nuevaRecepcion
     */
    public RecepcionTraspasoMercancia getNuevaRecepcion() {
        return nuevaRecepcion;
    }

    /**
     * @param nuevaRecepcion the nuevaRecepcion to set
     */
    public void setNuevaRecepcion(RecepcionTraspasoMercancia nuevaRecepcion) {
        this.nuevaRecepcion = nuevaRecepcion;
    }
}
